#! python3
import os
import time

from urllib import request

import requests
from tqdm import tqdm


def fun(blockNum, blockSize, totalSize):
    """
    使用urllib.urlretrieve下载时的回调函数，用来显示下载进度
    blockNum:当前的块编号
    blockSize:每次传输的块大小
    totalSize:文件总大小
    """
    downSIZE = blockNum * blockSize / 1024 / 1024
    totalSIZE = totalSize / 1024 / 1024
    percent = downSIZE / totalSIZE
    if percent > 1.0:
        percent = 1.0
    percent = percent * 100
    dtNow = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    print("[%s %.2fM/%.2fM]\t%.2f%%" % (dtNow, downSIZE, totalSIZE, percent))


try:

    path = 'F:/download/temp'
    # 创建保存目录
    if not os.path.exists(path):
        os.mkdir(path)

    BASE_URL = "http://localhost/new/"

    i = 1
    n = 10002726
    while i <= 1:
        filename = str(n) + '.mp4'
        url = BASE_URL + filename
        fileNameWithPath = os.path.join(path, filename)

        #  下载方法一：使用requests下载，支持断点续传
        response = requests.get(url, stream=True)
        totalSize = int(response.headers['content-length'])
        if os.path.exists(fileNameWithPath):
            localSize = os.path.getsize(fileNameWithPath)
        else:
            localSize = 0
        if localSize >= totalSize:
            print(filename, '下载完成')
            continue

        header = {"Range": f"bytes={localSize}-{totalSize}"}
        pBar = tqdm(
            total=totalSize,  # 进度条的总长度
            initial=localSize,  # 续传时的初始进度
            unit='B',  # 与显示下载速度有关的参数
            unit_scale=True,
            desc=filename  # 进度条左边显示的信息
        )
        req = requests.get(url, headers=header, stream=True)
        with(open(fileNameWithPath, 'ab')) as f:
            for text in response.iter_content(chunk_size=1024):
                if text:
                    f.write(text)
                    pBar.update(1024)  # 每次更新进度条的长度
        pBar.close()  # 关闭占用的资源
        f.close()

        #  下载方法二：使用urllib下载
        """
        函数：urllib.urlretrieve(url[, filename[, reporthook[, data]]]) 
        参数说明： 
        url：外部或者本地url ,url中不要含有中文，好像会出错。
        filename：指定了保存到本地的路径； 
        reporthook：是一个回调函数，当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函数来显示当前的下载进度。 
        data：指post到服务器的数据。该方法返回一个包含两个元素的元组(filename, headers)，filename表示保存到本地的路径，header表示服务器的响应头。 
        """
        # request.urlretrieve(url, fileName, fun)

        n += 1
        i += 1

except Exception as e:
    print('there have a error : ' + e)
